নেট মডিউলের পরিচিতি
নেট মডিউল হল Node.js এর মূল নেটওয়ার্কিং মডিউলগুলির মধ্যে একটি যা আপনাকে TCP সার্ভার এবং ক্লায়েন্ট তৈরি করতে দেয়। TCP (ট্রান্সমিশন কন্ট্রোল প্রোটোকল) নেটওয়ার্ক ডিভাইসে চলমান অ্যাপ্লিকেশনগুলির মধ্যে বাইটের একটি স্ট্রিমের একটি নির্ভরযোগ্য, অর্ডার করা এবং ত্রুটি-চেক করা ডেলিভারি।
নেট মডিউলের উপরে নির্মিত HTTP মডিউলের পরিবর্তে, নেট মডিউল নিম্ন-স্তরের নেটওয়ার্কিং ক্ষমতা প্রদান করে যা যোগাযোগ প্রোটোকলের উপর আরো নিয়ন্ত্রণ প্রদান করে।
দ্রষ্টব্য:
নেট মডিউল এমন পরিস্থিতিতে সবচেয়ে উপযুক্ত যেখানে একটি কাস্টম TCP প্রোটোকল প্রয়োজন হয় বা আপনি যখন TCP-এর উপরে আপনার নিজস্ব অ্যাপ্লিকেশন-স্তরের প্রোটোকল প্রয়োগ করতে চান।
একটি নেট মডিউল আমদানি করা হচ্ছে
নেট মডিউল, প্রয়োজন() পদ্ধতি ব্যবহার করে আপনার Node.js অ্যাপ্লিকেশনে যোগ করুন:
const net = require('net');
একটি TCP সার্ভার তৈরি করা
নেট মডিউল একটি টিসিপি সার্ভার তৈরি করা সহজ করে যা সংযোগের জন্য শোনে:
const net = require('net');
// Create a TCP server
const server = net.createServer((socket) => {
console.log('Client connected');
// Set encoding to utf8 so we receive strings instead of Buffer objects
socket.setEncoding('utf8');
// Handle data from client
socket.on('data', (data) => {
console.log(`Received from client: ${data}`);
// Echo the data back to the client
socket.write(`Echo: ${data}`);
});
// Handle client disconnection
socket.on('end', () => {
console.log('Client disconnected');
});
// Handle errors
socket.on('error', (err) => {
console.error('Socket error:', err);
});
// Send a welcome message to the client
socket.write('Welcome to the TCP server!\r\n');
});
// Start the server and listen on port 8080
server.listen(8080, () => {
console.log('TCP Server running on port 8080');
});
এই উদাহরণে:
একটি TCP ক্লায়েন্ট তৈরি করা হচ্ছে
আপনি একটি TCP সার্ভারের সাথে একটি ইন্টারনেট TCP ক্লায়েন্টও তৈরি করতে পারেন:
const net = require('net');
// Create a TCP client
const client = net.createConnection({ port: 8080 }, () => {
console.log('Connected to server');
// Send a message to the server
client.write('Hello from client!');
});
// Set encoding
client.setEncoding('utf8');
// Handle data from server
client.on('data', (data) => {
console.log(`Received from server: ${data}`);
// Send another message
client.write('More data from client');
});
// Handle connection end
client.on('end', () => {
console.log('Disconnected from server');
});
// Handle errors
client.on('error', (err) => {
console.error('Connection error:', err);
});
এই উদাহরণে:
পরীক্ষা নোট:
ক্লায়েন্ট এবং সার্ভার একসাথে পরীক্ষা করতে, একটি টার্মিনালে সার্ভার স্ক্রিপ্ট এবং অন্য টার্মিনালে ক্লায়েন্ট স্ক্রিপ্ট চালান।
সকেট বৈশিষ্ট্য এবং পদ্ধতি
সকেট অবজেক্ট সার্ভার কানেকশন কলব্যাকে প্রদত্ত এবং createConnection() দ্বারা প্রত্যাবর্তিত হয় এর বেশ কিছু দরকারী বৈশিষ্ট্য এবং পদ্ধতি রয়েছে:
| বৈশিষ্ট্য/পদ্ধতি | ব্যাখ্যা |
|---|---|
| socket.write(data[, encoding][, callback]) | ঐচ্ছিকভাবে নির্দিষ্ট এনকোডিং সহ সকেটে ডেটা লেখে |
| socket.end([data][, encoding][, callback]) | সমস্ত ডেটা লেখা এবং ফ্লাশ করার পরে সকেট বন্ধ করে |
| socket.setEncoding(encoding) | সকেটে প্রাপ্ত ডেটার জন্য এনকোডিং সেট করে |
| socket.setTimeout(timeout[, callback]) | নির্দিষ্ট মিলিসেকেন্ড নিষ্ক্রিয়তার পরে সকেটকে টাইমআউটে সেট করে |
| socket.setKeepAlive([enable][, initialDelay]) | কিপ-অসিলেশন ফাংশন সক্রিয়/অক্ষম করে |
| socket.address() | ঠিকানা, পরিবার এবং সংযোগের পোর্ট সহ একটি বস্তু প্রদান করে |
| socket.remoteAddress | একটি স্ট্রিং হিসাবে দূরবর্তী আইপি ঠিকানা |
| socket.remotePort | দূরবর্তী পোর্ট একটি সংখ্যা |
| socket.localAddress | স্থানীয় IP ঠিকানা সার্ভার শোনে |
| socket.localPort | স্থানীয় পোর্ট যেখানে সার্ভার শোনে |
| socket.bytesRead | প্রাপ্ত বাইট সংখ্যা |
| socket.bytesWritten | পাঠানো বাইট সংখ্যা |
সার্ভারের বৈশিষ্ট্য এবং পদ্ধতি
createServer() দ্বারা প্রত্যাবর্তিত সার্ভার অবজেক্টের এই দরকারী বৈশিষ্ট্য এবং পদ্ধতি রয়েছে:
| বৈশিষ্ট্য/পদ্ধতি | ব্যাখ্যা |
|---|---|
| server.listen(port[, hostname][, backlog][, callback]) | সংযোগের জন্য শোনার জন্য সার্ভার শুরু করে |
| server.close([callback]) | সার্ভারকে নতুন সংযোগ গ্রহণ করা বন্ধ করে |
| server.address() | সার্ভারের ঠিকানা তথ্য সহ একটি বস্তু প্রদান করে |
| server.maxConnections | সংযোগের সংখ্যা বাড়লে সংযোগ প্রত্যাখ্যান করার জন্য এই বৈশিষ্ট্যটি সেট করুন |
| server.connections | যুগপত সংযোগের সংখ্যা |
| server.listening | সার্ভার শুনছে কিনা তা নির্দেশ করে বুলিয়ান |
একটি চ্যাট সার্ভার তৈরি করা হচ্ছে
আসুন একটি সাধারণ চ্যাট সার্ভার তৈরি করি যা সমস্ত সংযুক্ত ক্লায়েন্টদের কাছে বার্তা সম্প্রচার করে:
const net = require('net');
// Store all client connections
const clients = [];
// Create a chat server
const server = net.createServer((socket) => {
// Generate a client ID
const clientId = `${socket.remoteAddress}:${socket.remotePort}`;
console.log(`Client connected: ${clientId}`);
// Set encoding
socket.setEncoding('utf8');
// Add client to the list
clients.push(socket);
// Send welcome message
socket.write(`Welcome to the chat server! There are ${clients.length} users online.\r\n`);
// Broadcast message to all clients except the sender
function broadcast(message, sender) {
clients.forEach(client => {
if (client !== sender) {
client.write(message);
}
});
}
// Notify all clients about the new connection
broadcast(`User ${clientId} joined the chat.\r\n`, socket);
// Handle client messages
socket.on('data', (data) => {
console.log(`${clientId}: ${data.trim()}`);
// Broadcast the message to all other clients
broadcast(`${clientId}: ${data}`, socket);
});
// Handle client disconnection
socket.on('end', () => {
console.log(`Client disconnected: ${clientId}`);
// Remove client from the list
const index = clients.indexOf(socket);
if (index !== -1) {
clients.splice(index, 1);
}
// Notify all clients about the disconnection
broadcast(`User ${clientId} left the chat.\r\n`, null);
});
// Handle errors
socket.on('error', (err) => {
console.error(`Socket error from ${clientId}:`, err);
});
});
// Start the server
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Chat server running on port ${PORT}`);
});
// Handle server errors
server.on('error', (err) => {
console.error('Server error:', err);
});
এই চ্যাট সার্ভারের সাথে সংযোগ করতে, আপনি একটি TCP ক্লায়েন্ট বা একটি টার্মিনাল টুল যেমন টেলনেট ব্যবহার করতে পারেন:
telnet localhost 8080
আপনি নেট মডিউল ব্যবহার করে একটি ডেডিকেটেড চ্যাট ক্লায়েন্টও তৈরি করতে পারেন:
const net = require('net');
const readline = require('readline');
// Create interface for reading from the terminal
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// Create a client connection
const client = net.createConnection({ port: 8080 }, () => {
console.log('Connected to chat server');
console.log('Type a message and press Enter to send');
// Start reading user input
rl.prompt();
});
// Set encoding
client.setEncoding('utf8');
// Handle data from server
client.on('data', (data) => {
// Move cursor to beginning of line and clear it
process.stdout.write('\r\x1b[K');
// Print the server message
console.log(data.trim());
// Re-display the prompt
rl.prompt();
});
// Handle connection end
client.on('end', () => {
console.log('Disconnected from server');
rl.close();
process.exit(0);
});
// Handle errors
client.on('error', (err) => {
console.error('Connection error:', err);
rl.close();
process.exit(1);
});
// Handle user input
rl.on('line', (input) => {
// Send the user input to the server
client.write(input);
rl.prompt();
});
// Close the connection when the user exits
rl.on('close', () => {
console.log('Exiting chat...');
client.end();
});
একটি সাধারণ প্রোটোকল তৈরি করা
NET মডিউল হল আপনার নিজস্ব অ্যাপ্লিকেশন প্রোটোকল তৈরি করার ক্ষমতা। আসুন একটি সাধারণ JSON-ভিত্তিক প্রোটোকল তৈরি করি:
const net = require('net');
// Create a server that supports a JSON-based protocol
const server = net.createServer((socket) => {
console.log('Client connected');
// Buffer for incoming data
let buffer = '';
// Handle data
socket.on('data', (data) => {
// Add the new data to our buffer
buffer += data.toString();
// Process complete messages
let boundary = buffer.indexOf('\n');
while (boundary !== -1) {
// Extract the complete message
const message = buffer.substring(0, boundary);
buffer = buffer.substring(boundary + 1);
// Process the message
try {
const parsedMessage = JSON.parse(message);
console.log('Received message:', parsedMessage);
// Handle different message types
switch (parsedMessage.type) {
case 'greeting':
socket.write(JSON.stringify({
type: 'welcome',
message: `Hello, ${parsedMessage.name}!`,
timestamp: Date.now()
}) + '\n');
break;
case 'query':
socket.write(JSON.stringify({
type: 'response',
queryId: parsedMessage.queryId,
result: handleQuery(parsedMessage.query),
timestamp: Date.now()
}) + '\n');
break;
default:
socket.write(JSON.stringify({
type: 'error',
message: 'Unknown message type',
timestamp: Date.now()
}) + '\n');
}
} catch (err) {
console.error('Error processing message:', err);
socket.write(JSON.stringify({
type: 'error',
message: 'Invalid JSON format',
timestamp: Date.now()
}) + '\n');
}
// Look for the next message
boundary = buffer.indexOf('\n');
}
});
// Handle disconnection
socket.on('end', () => {
console.log('Client disconnected');
});
// Handle errors
socket.on('error', (err) => {
console.error('Socket error:', err);
});
});
// Simple function to handle queries
function handleQuery(query) {
if (query === 'time') {
return { time: new Date().toISOString() };
} else if (query === 'stats') {
return {
uptime: process.uptime(),
memory: process.memoryUsage(),
platform: process.platform
};
} else {
return { error: 'Unknown query' };
}
}
// Start the server
const PORT = 8080;
server.listen(PORT, () => {
console.log(`JSON protocol server running on port ${PORT}`);
});
এখানে একটি ক্লায়েন্ট এই প্রোটোকল ব্যবহার করে:
const net = require('net');
// Connect to the server
const client = net.createConnection({ port: 8080 }, () => {
console.log('Connected to server');
// Send a greeting
send({
type: 'greeting',
name: 'Client'
});
// Send a query
send({
type: 'query',
queryId: 1,
query: 'time'
});
// Send another query
setTimeout(() => {
send({
type: 'query',
queryId: 2,
query: 'stats'
});
}, 1000);
});
// Buffer for incoming data
let buffer = '';
// Handle data from server
client.on('data', (data) => {
// Add the new data to our buffer
buffer += data.toString();
// Process complete messages
let boundary = buffer.indexOf('\n');
while (boundary !== -1) {
// Extract the complete message
const message = buffer.substring(0, boundary);
buffer = buffer.substring(boundary + 1);
// Process the message
try {
const parsedMessage = JSON.parse(message);
console.log('Received from server:', parsedMessage);
} catch (err) {
console.error('Error parsing message:', err);
}
// Look for the next message
boundary = buffer.indexOf('\n');
}
});
// Helper function to send messages
function send(message) {
const jsonString = JSON.stringify(message) + '\n';
console.log('Sending:', message);
client.write(jsonString);
}
// Handle connection end
client.on('end', () => {
console.log('Disconnected from server');
});
// Handle errors
client.on('error', (err) => {
console.error('Connection error:', err);
});
// Close the connection after some time
setTimeout(() => {
console.log('Closing connection');
client.end();
}, 5000);
নৈতিক নোট:
এই প্রোটোকলে, আমরা বার্তা ধারাবাহিকতার জন্য JSON ব্যবহার করি এবং বার্তার সীমানাগুলির জন্য নতুন লাইন অক্ষর (\n) ব্যবহার করি। এটি বার্তাগুলিকে পার্স করা সহজ করে তোলে এবং বিভিন্ন ধরণের বার্তা এবং পেলোডের জন্য অনুমতি দেয়৷
সকেট টাইমআউট
নিষ্ক্রিয় সংযোগগুলি পরিচালনা করতে, আপনি সকেটে একটি সময়সীমা সেট করতে পারেন:
const net = require('net');
const server = net.createServer((socket) => {
console.log('Client connected');
// Set a timeout of 10 seconds
socket.setTimeout(10000);
// Handle timeout
socket.on('timeout', () => {
console.log('Socket timeout');
socket.write('You have been inactive for too long. Disconnecting...\r\n');
socket.end();
});
// Handle data
socket.on('data', (data) => {
console.log(`Received: ${data.toString().trim()}`);
socket.write(`Echo: ${data}`);
});
// Handle disconnection
socket.on('end', () => {
console.log('Client disconnected');
});
});
server.listen(8080, () => {
console.log('Server with timeout running on port 8080');
});
আইপিসি (আন্তঃপ্রক্রিয়া যোগাযোগ) এর সাথে কাজ করা
নেট মডিউল উইন্ডোজে ইউনিক্স ডোমেইন সকেট বা নামযুক্ত পাইপ ব্যবহার করে IPC (আন্তঃ-প্রক্রিয়া যোগাযোগ) সার্ভার এবং ক্লায়েন্ট তৈরি করতে পারে:
const net = require('net');
const path = require('path');
// Define the path for the IPC socket
const socketPath = path.join(__dirname, 'ipc-socket');
// Create an IPC server
const server = net.createServer((socket) => {
console.log('Client connected to IPC server');
socket.on('data', (data) => {
console.log(`Received via IPC: ${data.toString().trim()}`);
socket.write(`Echo: ${data}`);
});
socket.on('end', () => {
console.log('Client disconnected from IPC server');
});
});
// Start the IPC server
server.listen(socketPath, () => {
console.log(`IPC server running at ${socketPath}`);
});
// Clean up the socket file when the server closes
server.on('close', () => {
console.log('Cleaning up socket file');
require('fs').unlinkSync(socketPath);
});
// Handle process termination
process.on('SIGINT', () => {
server.close(() => {
console.log('IPC server closed');
process.exit(0);
});
});
এবং এখানে একটি আইপিসি ক্লায়েন্ট:
const net = require('net');
const path = require('path');
// Define the path for the IPC socket
const socketPath = path.join(__dirname, 'ipc-socket');
// Create an IPC client
const client = net.createConnection({ path: socketPath }, () => {
console.log('Connected to IPC server');
client.write('Hello from IPC client!');
});
client.on('data', (data) => {
console.log(`Received from IPC server: ${data.toString().trim()}`);
client.end();
});
client.on('end', () => {
console.log('Disconnected from IPC server');
});
client.on('error', (err) => {
console.error('Connection error:', err);
});
IPC এর সুবিধা:
ইউনিক্স ডোমেইন সকেট বা নামযুক্ত পাইপ ব্যবহার করে আইপিসি সংযোগগুলি সাধারণত টিসিপি সংযোগের চেয়ে দ্রুত এবং আরও নিরাপদ কারণ তারা নেটওয়ার্ক স্ট্যাক ব্যবহার করে না এবং স্থানীয় মেশিনে সীমাবদ্ধ।
সর্বোত্তম অনুশীলন
নেট ভলিউম বনাম HTTP ব্লক
| বৈশিষ্ট্য | নেট মডিউল | HTTP ব্লক |
|---|---|---|
| নৈতিকতা | কাঁচা TCP/IP | HTTP প্রোটোকল |
| বার্তা বিন্যাস | কাস্টম (আপনি সংজ্ঞায়িত) | HTTP অনুরোধ/প্রতিক্রিয়া |
| কম্প্রেশন স্তর | নিম্ন-স্তরের, উচ্চ নিয়ন্ত্রণ | উচ্চ-স্তরের, ব্যবহার করা সহজ |
| কেস ব্যবহার করুন | কাস্টম প্রোটোকল, কর্মক্ষমতা-সমালোচনামূলক অ্যাপ্লিকেশন | ওয়েব অ্যাপ্লিকেশন, REST API |
নেট মডিউল ব্যবহার করার সময়:
- আপনাকে অবশ্যই একটি কাস্টম প্রোটোকল বাস্তবায়ন করতে হবে
- যোগাযোগের উপর আরও নিয়ন্ত্রণ
- কর্মক্ষমতা উন্নত
- আপনি একটি নন-HTTP TCP সার্ভার তৈরি করুন (চ্যাট, গেম, ইত্যাদি)
HTTP মডিউল ব্যবহার করার সময়:
- আপনি একটি ওয়েব সার্ভার বা API তৈরি করছেন
- অনুরোধ রাউটিং, শিরোনাম, ইত্যাদির মতো HTTP-নির্দিষ্ট বৈশিষ্ট্যগুলির প্রয়োজন৷
- আপনি এক্সপ্রেসের মতো উচ্চ-স্তরের ওয়েব ফ্রেমওয়ার্ক ব্যবহার করতে চান
সারাংশ
Node.js Net TCP . :
কাস্টম প্রোটোকলের জন্য নিম্ন-স্তরের সকেট অ্যাক্সেস
সংযোগ পরিচালনার জন্য একটি অ্যাসিঙ্ক্রোনাস, ইভেন্ট-চালিত API
TCP/IP এবং IPC উভয় যোগাযোগের জন্য সমর্থন
উচ্চ-স্তরের প্রোটোকলের জন্য ব্লক তৈরি করা
যদিও এটির জন্য HTTP-এর মতো উচ্চ-স্তরের মডিউলের চেয়ে বেশি ম্যানুয়াল কাজের প্রয়োজন হয়, নেট মডিউলটি আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় প্রোটোকলটি বাস্তবায়নের জন্য নমনীয়তা প্রদান করে।
পর্যবেক্ষণ নোট:
নেটস্ট্যাট, ss, বা lsof-এর মতো টুল ব্যবহার করে সবসময় আপনার TCP সার্ভারের পারফরম্যান্স নিরীক্ষণ করুন যাতে বাধা এবং সংযোগের সমস্যা চিহ্নিত করা যায়।